Kong GatewayのAI ProxyプラグインでAmazon Bedrockのモデルを実行してみる
生成AIを使って業務を効率化したい えがわ です。
本記事は「Kong Advent Calendar 2024」の12日目のエントリとして、Kong GatewayのAI Proxyプラグインを使用してBedrockでモデルを実行してみます。
KongといえばAPI Gatewayという方も多いと思いますが、生成AIの機能も非常に強力です。
今回はKong GatewayのAIプラグインを活用しAmazon Bedrockを使用して言語モデルを実行します。
Kongの説明は以下の記事をご確認ください。
構成図
今回の構成図はこちらです。
Kong Konnectを使用してEC2にKong Gatewayをデプロイし、AI ProxyプラグインでBedrockのモデルを実行します。
AWSのリソースにKong Gatewayをデプロイすることで、キーやシークレットが必要なくIAMロールで管理を行うことが可能です。
環境
- Kong Konnect
- Kong Gateway 3.8
- EC2: Amazon Linux 2023
事前準備
EC2の起動および接続方法については本題から外れるため割愛します。
パブリックサブネットに配置、IPアドレスの付与、そして、以下のセキュリティグループの設定が必要です。
セキュリティグループの設定
Kong GatewayはデフォルトではTCP8000を使用しますので、セキュリティグループのインバウンドルールを許可しておきます。
他の機能を使用する場合はそのポートも許可する必要があります。
こちらより抜粋
IAMロールを作成
EC2からBedrock呼び出すため、EC2に付与するIAMロールを作成します。
IAMポリシーとしてbedrock:InvokeModel
を許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": "*"
}
]
}
作成したロールをEC2に設定します。
Dockerを起動
EC2に接続しDockerを起動します。
# システムの更新
sudo dnf update -y
# Dockerのインストール
sudo dnf install docker -y
# Dockerサービスの起動
sudo systemctl start docker
# システム起動時にDockerを自動起動する設定
sudo systemctl enable docker
# 現在のユーザー(ec2-user)をdockerグループに追加
sudo usermod -aG docker ec2-user
# Dockerバージョンの確認
docker --version
Kong Gatewayを起動
KonnectからKong Gatewayを作成していきます。
Gateway Manager -> New Gateway
を押下します。
Self-Managed Hybrid
を選択し、Nameを入力します。
PlatformでLinux (Docker)
を選択し、Generate Certificate
を押下します。
表示されたdocker run
コマンドを実行します。
※文頭にsudoを付与する必要があります。
EC2でKong Gatewayを起動できました。
やってみる
今回はBedrockのモデルとしてNova Liteを使用します。
BedrockのモデルIDはこちらから確認が可能です。
Serviceを作成
BedrockにアクセスするためのServiceを作成します。
項目 | 値 |
---|---|
Name | bedrock-service |
Upstream URL | https://bedrock-runtime.us-east-1.amazonaws.com |
Routeを作成
BedrockにアクセスするためのRouteを作成します。
項目 | 値 |
---|---|
Name | nova-lite-route |
Service | 作成したService |
Paths | /bedrock/novalite |
Routeが作成できました。
プラグインを作成
Bedrockを利用するため、RouteにAI Proxyプラグインを設定します。
AI Proxyプラグインを選択し、設定画面に遷移します。
Nova Liteを使用するため、Model.Nameにはamazon.nova-lite-v1:0
を使用します。
項目 | 値 |
---|---|
Model.Name | amazon.nova-lite-v1:0 |
Model.Options.Bedrock.Aws Region | us-east-1 |
Model.Provider | bedrock |
Route Type | /llm/v1/chat |
やってみる
準備ができたので、作成したルートにアクセスしてみます。
EC2のグローバルIP宛にリクエストします。
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 09 Dec 2024 05:55:06 GMT
x-amzn-RequestId: 031e9356-d759-498f-9345-891c4861b152
X-Kong-LLM-Model: bedrock/amazon.nova-lite-v1:0
X-Kong-Upstream-Latency: 249
X-Kong-Proxy-Latency: 1
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 7287413cabbf3741d1eaa03dab06216b
{
"object": "chat.completion",
"model": "amazon.nova-lite-v1:0",
"usage": {
"prompt_tokens": 14,
"total_tokens": 71,
"completion_tokens": 57
},
"choices": [
{
"finish_reason": "end_turn",
"message": {
"content": "1 + 1は2です。これは基本的な加算の法則に基づくもので、2つの1を合計すると2になります。数学では、このような基本的な演算は非常に重要で、より複雑な計算や理論の基礎となります。",
"role": "assistant"
},
"index": 0
}
]
}
AI Proxyプラグインを使用してBedrockへアクセスすることができました。
AI Prompt Guardプラグイン
AI Prompt Guard
はプロンプトを精査し、リクエストを制御することが可能です。
- If any deny expressions are set, and the request matches any regex pattern in the deny list, the caller receives a 400 response.
- If any allow expressions are set, but the request matches none of the allowed expressions, the caller also receives a 400 response.
- If any allow expressions are set, and the request matches one of the allow expressions, the request passes through to the LLM.
- If there are both deny and allow expressions set, the deny condition takes precedence over allow. Any request that matches an entry in the deny list will return a 400 response, even if it also matches an expression in the allow list. If the request does not match an expression in the deny list, then it must match an expression in the allow list to be passed through to the LLM
こちらから抜粋
文章問題のように感じますが、要約すると以下となります。
- 拒否リストに設定された文字列は拒否
- 許可リストが設定されており、その文字列を含んでいなければ拒否
許可リストに挨拶を設定し、挨拶ができない人は回答を得られないようにしてみます。
挨拶なしでリクエストしてみます。
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
HTTP/1.1 400 Bad Request
Date: Mon, 09 Dec 2024 06:39:47 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 35
X-Kong-Response-Latency: 1
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 8d470f3ff7bf486f03b6e443f17b4e1c
{"error":{"message":"bad request"}}
挨拶ができないので、回答を得られません。
プロンプトに挨拶を含めます。
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/novalite \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "こんにちは、1 + 1はなんですか?"} ] }'
{
"object": "chat.completion",
"model": "amazon.nova-lite-v1:0",
"usage": {
"prompt_tokens": 16,
"total_tokens": 45,
"completion_tokens": 29
},
"choices": [
{
"finish_reason": "end_turn",
"message": {
"content": "こんにちは、1 + 1 は 2 です。もっと複雑な計算や数学に関する質問があれば、いつでも聞いてください。",
"role": "assistant"
},
"index": 0
}
]
}
挨拶ができたので、回答を得ることができました。
別のLLMにアクセスしてみる(オプション)
AI Proxyプラグインは同じリクエストパラメータで別のモデルを利用することが可能です。
そのため、簡単にモデルを切り替えることが可能です。
Bedrockに限らず、OpenAI社のモデルなど別のモデルにアクセスする際も同様です。
以下の設定でルートとプラグインを設定します。
ルート
項目 | 値 |
---|---|
Name | claude-haiku-3-route |
Service | 作成したService |
Paths | /bedrock/haiku |
AI Proxyプラグイン
項目 | 値 |
---|---|
Model.Name | anthropic.claude-3-haiku-20240307-v1:0 |
Model.Options.Bedrock.Aws Region | us-east-1 |
Model.Provider | bedrock |
Route Type | /llm/v1/chat |
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/haiku \
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 09 Dec 2024 06:06:08 GMT
x-amzn-RequestId: 2042351d-2100-4059-b6be-333d278f9aee
X-Kong-LLM-Model: bedrock/anthropic.claude-3-haiku-20240307-v1:0
X-Kong-Upstream-Latency: 432
X-Kong-Proxy-Latency: 2
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 0ef399731b1f2659c759542a7144e172
{
"object": "chat.completion",
"model": "anthropic.claude-3-haiku-20240307-v1:0",
"usage": {
"prompt_tokens": 27,
"total_tokens": 43,
"completion_tokens": 16
},
"choices": [
{
"finish_reason": "end_turn",
"message": {
"content": "1 + 1 は 2 です。",
"role": "assistant"
},
"index": 0
}
]
}
サポートされていないモデルの場合
サポートされていないモデルも存在します。
以下の設定でAI Proxyプラグインを設定し、アクセスしてみます。
項目 | 値 |
---|---|
Model.Name | anthropic.claude-3-5-haiku-20241022-v1:0 |
Model.Options.Bedrock.Aws Region | us-east-1 |
Model.Provider | bedrock |
Route Type | /llm/v1/chat |
curl -i -X POST http://{xxx.xxx.xxx.xxx}:8000/bedrock/haiku
-H 'Content-Type: application/json' \
--data-raw '{ "messages": [ { "role": "system", "content": "あなたは数学者です" }, { "role": "user", "content": "1 + 1はなんですか?"} ] }'
HTTP/1.1 400 Bad Request
Content-Type: application/json
Connection: keep-alive
Date: Mon, 09 Dec 2024 06:01:27 GMT
x-amzn-RequestId: 42436ca7-795e-4a31-b789-d2342510ffac
x-amzn-ErrorType: ValidationException:http://internal.amazon.com/coral/com.amazon.bedrock/
Content-Length: 210
X-Kong-Upstream-Latency: 30
X-Kong-Proxy-Latency: 3
Via: 1.1 kong/3.8.0.0-enterprise-edition
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: d59e1b24f6d59e04a9c7543f83ee3714
{
"message": "Invocation of model ID anthropic.claude-3-5-haiku-20241022-v1:0 with on-demand throughput isn’t supported. Retry your request with the ID or ARN of an inference profile that contains this model."
}
2024/12/09現在、Claude 3.5 Haikuはサポートされていないといったメッセージが返ってきます。
さいごに
Kong GatewayのAI Proxyプラグインを使用してBedrockのモデルを実行してみました。
今回はAI ProxyとAI Prompt Guardを使用していますが、トークンでの流量制限など、生成AI専用のプラグインも多数存在します。
Kong Gatewayでプラグインを活用し、セキュアな生成AIアプリケーションを作成してみてはいかがでしょうか。
この記事がどなたかの参考になれば幸いです。